home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / language / albug.m65 < prev    next >
Text File  |  1995-04-22  |  40KB  |  1,761 lines

  1. ;<HESS.ATARI>ALBUG.M65.71 12-Mar-82 15:25:26, Edit by HESS
  2.  
  3.     .TITLE LBUG - 6502 DEBUGGER (ATARI VERSION)
  4.     ; (C) Ted Hess, Hudson, Ma. 1977,1978,1979,1980,1981,1982 
  5.  
  6.     .LIST    MB        ;LIST BINARY IN MACROS
  7.     .NLIST    TOC        ;NO TABLE OF CONTENTS
  8.     .ENABL    LC        ;ALLOW LOWER CASE TEXT
  9.  
  10. ; INVOKE SYSTEM MACROS FOR PARAMETER DEFINITIONS
  11.  
  12.     .MCALL    ATARI
  13.     .MCALL    M6502
  14.         ATARI
  15.         M6502
  16.  
  17. ;***** THINGS TO DO ******
  18. ;
  19. ; 1) Re-write parser for DDT syntax and better defaults
  20. ;    Make better use of ATARI keyboard!
  21. ;
  22. ;*************************
  23.  
  24. ;LBUG STORAGE ASSIGNMENTS (PAGE 0)
  25.  
  26. INBUF    =$E0        ;INPUT BUFFER (2 BYTES)
  27. POINT    =$E2        ;OPEN CELL ADDRS (2 BYTES)
  28. AC    =$E4        ;ACCUMULATOR
  29. XREG    =$E5        ;X INDEX
  30. YREG    =$E6        ;Y INDEX
  31. PS    =$E7        ;PROCESSOR STATUS REG
  32. SP    =$E8        ;STACK POINTER
  33.  
  34. ;RANDOM CONSTANTS AND PARAMETERS
  35.  
  36. DSKCOD    =$31        ;DISK DEVICE CODE
  37. DSKR    ='R        ;DISK READ COMMAND
  38. DSKW    ='W        ;DISK WRITE COMMAND
  39. MAXBP    =8        ;EIGHT IS TRADITIONAL (BREAK POINTS)
  40. LNSCR    =24        ;# OF LINES ON SCREEN
  41. LPP    =55        ;LINES/PAGE ON PRINTER
  42.  
  43. .IIF NDF,LORG, LORG= $8000    ;DEFAULT PROG ORIGIN
  44.  
  45. ;MAIN ENTRY POINT - NORMAL START (LORG)
  46. ;RESET ENTRY - REMOVE BREAKPOINTS (LORG+3)
  47.  
  48.     SETPC PPC,LORG
  49.  
  50. ;NORMAL START ENTRY
  51.  
  52. START:    JMP    STRT1
  53.     JMP    RST
  54.  
  55. VERS:    .ASCII    <.ATCLR>"Lady Bug - V4.0, (C) Ted Hess 1981"<.ATEOL>
  56. ROF:    .BLKB    1    ; REGISTER OPENED FLAG
  57.             ;  0 = CLOSED
  58.             ;  $1 = HEX/OCTAL
  59.             ;  $FF = SYMBOLIC
  60. CF:    .BLKB    1    ;ADDRESS FLAG
  61.             ;  $FF = NO ADDRESSES TYPED
  62.             ;  $00 = ONE ADDRESS TYPED
  63.             ;  $01 = COMMA TYPED
  64. PRPC:    .BLKB    2    ;PROGRAM COUNTER (AT BREAK)
  65. LENGTH:    .BLKB    1    ; LENGTH OF INSTR (0 := 1-BYTE)
  66. PFRMT:    .BLKB    1    ; PRINT FORMAT INDEX
  67. VEB:    .BLKB    2    ;4 BYTE PROGRAM BLOCK
  68. LMNEM:    .BLKB    1    ;(VEB+2) TEMP FOR MNEMONIC PRINT
  69. RMNEM:    .BLKB    1    ;(VEB+3) ...
  70. STARTA:    .BLKB    2    ;STARTING ADDRESS
  71. ENDAD:    .BLKB    2    ;ENDING ADDRESS
  72. TEMPX:    .BLKB    1    ;NEED TO SAVE X AROUND OS
  73. TEMPY:    .BLKB    1    ;TEMP SAVE Y
  74. SNGLF:    .BLKB    1    ;SINGLE STEP FLAG
  75. BPN:    .BLKB    1    ;BREAKPOINT NUMBER OR 0
  76. DRVNO:    .BLKB    1    ;DISK UNIT #
  77. PIOCB:    .BLKB    1    ;IOCB INDEX FOR PRINTER/EDITOR
  78. PNTF:    .BLKB    1    ; PRINTER FLAG
  79.  
  80. TABPT:    .BLKB    1    ;INDEX INTO TAB RING
  81. TABRNG:    .BLKW    8    ;RING BUFFER FOR TAB/UNTAB
  82.  
  83. ;BREAKPOINT TABLES
  84.  
  85. BPINS:    .BLKB    MAXBP        ;SAVE INSTR
  86. BPCNT:    .BLKB    MAXBP        ;PROCEED COUNT
  87. BPLOCL:    .BLKB    MAXBP        ;LOCATION LOW
  88. BPLOCH:    .BLKB    MAXBP        ;LOCATION HIGH
  89.  
  90. ;RESET ENTRY
  91.  
  92. RST:    CALL    REMB        ;REMOVE BREAK POINTS
  93.  
  94. ; NORMAL STARTUP JOINS HERE
  95.  
  96. STRT1:    CALL    INITS        ;INITIALIZE THINGS
  97.     TYPE    VERS        ;OUTPUT HERALD
  98.     CLR    <SNGLF,BPN,DRVNO,PS> ;CLEAR SS FLAG, ETC.
  99.     SET2    BREAK,VBREAK    ;BREAK POINT ENTRY
  100.     TSX            ;SAVE CURRENT STACK POINTER
  101.     STX    SP
  102.     JMP    RALL        ;CLEAR ALL BREAK POINTS
  103.  
  104. ;MAIN DECODER
  105.  
  106. ERR:    CALL    ERRFST        ;PRINT <BELL>?
  107.  
  108. DCD:    CALL    CLOSEP        ;CLOSE PRINTER IF OPEN
  109.     CALL    CRLFS        ;PRINT CRLF
  110. DCD4:    CLR    ROF        ;CLOSE OPEN REG
  111.     LDX    SP        ;RESTORE STACK POINTER
  112.     TXS
  113.  
  114. SCAN:    LDA    #$FF        ;SET UP ADDRESS FLAG
  115.     STA    CF
  116.     CALL    GETNUM        ;INPUT SOMETHING
  117.     LDX    CF        ;GET QUANITY TYPED FLAG
  118.     BMI    CLGL        ;DO NOT DESTROY OLD VALUE FOR ' AND =
  119.  
  120. SCAN1:    MOV2X    INBUF,STARTA    ;SET UP STARTING ADDRESS
  121. ;FALL INTO SPECAIL CHARACTER DECODER
  122.  
  123.  
  124. ;HERE TO CHECK LEGAL CHARACTER
  125.  
  126. CLGL:    LDX    #MAXL        ;INIT INDEX
  127. LGL1:    CMP    LGCH,X        ;MATCH?
  128.     BEQ    LGL2        ;YES - PROCEED
  129.     DEX            ;NO - STEP TO NEXT
  130.     BPL    LGL1        ;BRANCH IF MORE TO GO
  131.     BMI    ERR        ;ERROR IF NONE
  132.  
  133. ;FOUND MATCH - DISPATCH
  134.  
  135. LGL2:    TXA            ;GET INDEX
  136. LGL3:    ASL    A        ; TIMES 2
  137.     TAX            ; BACK TO X
  138.     LDA    LDISP+1,X    ;GET HIGH BYTE OF XFER
  139.     PHA            ;PUT ON STACK
  140.     LDA    LDISP,X        ;GET XFER LOW
  141.     PHA            ;STACK NOW HAS XFER ADDRS
  142.     LDA    CF        ;GET ARGUMENT FLAG IN AC
  143.     CMP    #1        ;SET FLAGS BASED ON ONE
  144.     RET            ;DISPATCH
  145.                 
  146. ERRFST:    LDA    #.ATBEL        ;RING BELL
  147.     CALL    OUTSCH
  148.     LDA    #'?        ;THEN PRINT ?
  149.     JMP    OUTSCH
  150. ;COMMA - SAVE INPUT AS STARTING ADDRESS
  151.  
  152. COMMA:    LDA    CF        ;GET ARGUMENT FLAG IN AC
  153.     BNE    ERR        ;MUST BE ONE AND ONLY ONE ARGUMENT TYPED SO FAR
  154.     CALL    GETNUM        ;GET ANOTHER ARGUMENT
  155. COMMA1:    MOV2X    INBUF,ENDAD    ;SET UP ENDING ADDRESS
  156.     LDX    CF        ;GET ARGUMENT FLAG
  157.     CPX    #2        ;CHECK TO SEE IF IT IS OPEN
  158.     BPL    ERR        ;NO THEN IT IS AN ERROR
  159.     BMI    CLGL        ;GO DISPATCH ON BREAK CHARACTER
  160.  
  161.  
  162. ;ESC SEEN (ECHO $)
  163.  
  164. ESC:    LDA    #'$
  165.     CALL    OUTSCH
  166.     CALL    GETSCH        ;GET NEXT CHARACTER
  167.     SEC            ;CLEAR BORROW
  168.     SBC    #'1        ;CHECK FOR NUMBER
  169.     BMI    ERR        ;IF LESS THAN THEN IT IS AN ERROR
  170.     CMP    #MAXBP        ;IS IT LESS THAN MAXIMUM ALLOWABLE BREAKPOINT
  171.     BMI    ESCB        ;YES GO GET BREAKPOINT B
  172.     SBC    #@20        ;CHECK FOR A
  173.     BMI    ERR        ;IF LESS THAN A IT IS AN ERROR
  174.     AND    #@337        ;GET RID OF LOWERCASE BIT
  175.     CMP    #'Z-@100    ;IS IT GREATER THAN Z
  176.     BPL    ERR1        ;YES.  REPORT ERROR
  177.     TAX            ;PUT IT IN THE X REGISTER
  178.     LDA    ARGNUM,X    ;GET NUMBER OF ARGUMENTS
  179.     CMP    CF        ;IS IT CORRECT
  180.     BEQ    10$        ;YES.  SKIP REST OF TEST
  181.     CMP    #$80        ;IS IT ONE OR NONE FLAG
  182.     BNE    ERR1        ;NO GIVE ERROR
  183.     LDA    CF        ;GET FLAG
  184.     CMP    #1        ;LESS THAN ONE
  185.     BPL    ERR1        ;NO. GO GIVE ERROR
  186. 10$:    TXA            ;GET INDEX BACK TO A
  187.     CLC
  188.     ADC    #<DISP-LDISP>/2    ;CALC TABLE OFFSET
  189.     BNE    LGL3        ;DISPATCH
  190.  
  191. ESCB:    TAX            ;SAVE BP NUMBER IN X
  192.     CALL    GETSCH        ;GET THE CHARACTER
  193.     AND    #@337        ;GET RID OF CASE BIT
  194.     CMP    #'B        ;IS IT A B
  195.     BNE    ERR1        ;NO. THEN IT IS AN ERROR
  196.     JMP    BKPT1        ;YES. GO DO BREAKPOINT
  197.  
  198.  
  199. ;DOT (.) SEEN - SUBSTITUE CURRENT LOC
  200.  
  201. DOT:    MOV2    POINT,INBUF    ;PUT LOC INTO BUFFER
  202. DOT1:    CALL    GETSCH        ;GET ANOTHER CHARACTER
  203.     INC    CF        ;SAY QUANT TYPED
  204.     BNE    COMMA1        ;GO SET UP ENDING ADDRESS
  205.     JMP    SCAN1        ;BACK TO SCAN LOOP
  206.  
  207.  
  208. ;PERCENT SEEN - SPECIAL REGISTER
  209.  
  210. PERC:    CALL    GETSCH        ;LOOK AT NEXT CHAR
  211.     AND    #@337        ;GET RID OF CASE BIT
  212.     LDX    #MAXS        ; AND CHECK FOR SPECIAL
  213. PERC1:    CMP    LGPC,X        ;MATCH?
  214.     BEQ    PERC2        ;???
  215.     DEX            ;NO - STEP TO NEXT
  216.     BPL    PERC1
  217. ERR1:    JMP    ERR        ;ERROR IF NO MORE
  218.  
  219.  
  220. ;SETUP DESIRED REGISTER ADDRS AS INPUT TYPED
  221.  
  222. PERC2:    LDA    PERAD,X        ;GET ADDRS OF BYTE
  223.     STA    INBUF        ;STORE AS INPUT
  224.     CLR    INBUF+1
  225.     BEQ    DOT1        ;BACK TO INPUT LOOP
  226.  
  227.  
  228. ;CARRIAGE RETURN TYPED
  229.  
  230. CRET:    CALL    CLSE        ;CLOSE OPEN REG IF ANY
  231.     JMP    DCD        ;RE-INIT THINGS
  232. ;SLASH TYPED - OPEN A REG IN SYMBOLIC
  233.  
  234. SLSH:    BPL    ERR1        ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
  235.     LDA    #$FF        ;SET ROF FLAG
  236.     BNE    SLSH1        ;JOIN COMMON CODE
  237.  
  238. ;SLASH TYPED - OPEN A REG (HEX)
  239.  
  240. BRAKET:    BPL    ERR1        ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
  241.     LDA    #1        ;SET REG OPEN
  242. SLSH1:    STA    ROF
  243.     CALL    OUTSSP        ;TYPE A SPACE
  244.     LDA    CF        ;ANYTHING TYPED
  245.     BNE    10$        ; ??
  246.     CALL    INTPT        ;YES - OPEN IT
  247. 10$:    CALL    PRTSCN        ;GO DO OUTPUT
  248.     JMP    SCAN
  249.  
  250.  
  251. ;LINE FEED - OPEN NEXT REG
  252.  
  253. LFD:    BPL    ERR1        ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
  254.     CALL    CRLFS        ;OUTPUT <EOL>
  255. LFD0:    LDA    ROF        ;CHECK TYPE
  256.     BMI    LFDS        ;DO SYMBOLIC NEXT INSTR
  257.     CALL    CLSE        ;CLOSE OPEN REG IF ANY
  258.     CALL    INCPT        ;STEP TO NEXT LOC
  259. LFDC:    INC    ROF        ;MARK OPEN HEX
  260.     LDX    #'[        ;SLASH
  261.     CALL    PRTSLC        ;GO PRINT THE CONTENTS
  262.     JMP    SCAN
  263.  
  264. LFDS:    CALL    PCADJ        ;STEP OVER INSTR
  265.     STA    POINT        ;SAVE NEW PC
  266.     STY    POINT+1
  267. LFDS1:    CALL    PRTSLS        ;GO PRINT LOCATION IN SYMBOLIC
  268.     JMP    SCAN        ;BACK TO MAIN COMMAND DECODER
  269. ;^ OR <BS> TYPED - OPEN PREVIOUS
  270.  
  271. BACK:    BPL    ERR1        ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
  272.     CALL    CLSE        ;CLOSE OPEN REG
  273.     CALL    DECPT        ;DECREMENT THE POINTER
  274.     CALL    CRLFS        ;PUT OUT A CARRIAGE RETURN LINE FEED
  275.     JMP    LFDC        ;COMMON CODE
  276.  
  277. ;TAB  GO TO ADDRESS IF IN SYMBOLIC MODE
  278.  
  279. TAB:    BPL    ERR1        ;ERROR IF MORE THAN 1 ARG
  280.     LDA    ROF        ;GET OUTPUT MODE FLAG
  281.     BPL    ERR1        ;ONLY GET EFFECTIVE ADDRESS IF SYMBOLIC
  282.     LDX    TABPT        ;SAVE POINT
  283.     LDA    POINT
  284.     STA    TABRNG,X    ;IN RING BUFFER
  285.     LDA    POINT+1
  286.     STA    TABRNG+8,X
  287.     INX            ;STEP INDEX
  288.     TXA
  289.     AND    #$07        ;MASK TO MOD 8 CNTR
  290.     STA    TABPT        ;STORE IT BACK
  291.     CALL    CALCAD        ;CALCULATE EFFECTIVE ADDRESS
  292.     MOV2    INBUF,POINT    ;GET JMP ADDRESS
  293. TAB1:    CALL    CRLFS        ;PUT OUT CARRIAGE RETURN LINE FEED
  294.     JMP    LFDS1        ;GO TYPE OUT NEW ADDRESS
  295.  
  296. ; UNTABIFY - POP RING THEN TAB
  297.  
  298. UNTAB:    BPL    5$        ;ERROR IF ANYTHING TYPED
  299.     LDA    ROF        ;REGISTER OPEN FLAG
  300. 5$:    BPL    ERR2        ;ERROR IF NOT SYMBOLIC MODE
  301.     LDA    #$7        ;MASK FOR MOD 8 SUBTRACT
  302.     DEC    TABPT        ;DECREMENT INDEX
  303.     AND    TABPT        ;MASK IT
  304.     STA    TABPT        ;STORE RESULT
  305.     TAX            ;XFER TO INDEX
  306.     LDA    TABRNG,X    ;FETCH SAVED VALUE
  307.     STA    POINT        ;RESTORE TO POINT
  308.     LDA    TABRNG+8,X
  309.     STA    POINT+1
  310.     JMP    TAB1        ;FINISH THRU COMMON CODE
  311.  
  312. ;EQUAL SIGN - TYPE IN OCTAL
  313.  
  314. TOC:    BPL    ERR2        ;IF MORE THAN ONE ARGUMENT IT IS AN ERROR
  315.     LDA    STARTA        ;GET CHARACTER IN A
  316.     STA    PFRMT        ;SAVE BYTE
  317.     LDX    #3        ;TYPE 3 DIGITS
  318.     LDY    #3        ; OF 3 BITS EACH
  319.     CLC            ;INIT CARRY BIT
  320.     BCC    15$        ;SKIP FIRST SHIFT
  321. 10$:    ASL    PFRMT        ;SHIFT LEFT
  322. 15$:    ROL    A        ;GET BIT INTO AC
  323.     DEY            ;COUNT BITS
  324.     BNE    10$        ;CONTINUE FOR 3 BITS
  325.     AND    #@7        ;GRNTEE OIT
  326.     CALL    HEXST1        ;TYPE OUT
  327.     LDY    #3        ;RELOAD BIT COUNTER
  328.     DEX            ;DECREMENT DIGIT COUNTER
  329.     BNE    10